In this Rmarkdown document we are going to load the MAGIC-denoised data to better visualize genes and ease with the annotation when using specific marker genes. MAGIC was developed by Smita Krishnaswamy’s lab to try to fill in the drop out reads in the spots. MAGIC is a Markov Affinity-based Graph Imputation of Cells used for denoising high-dimensional data most commonly applied to single-cell RNA sequencing data. MAGIC learns the manifold data, using the resultant graph to smooth the features and restore the structure of the data based on their k-nearest neighbors.
library(Seurat)
library(dplyr)
library(ggplot2)
library(SPATA2)
library(UCell)
library(stringr)
set.seed(123)
source(here::here("misc/paths.R"))
source(here::here("utils/bin.R"))
"{plasma}/{plt_dir}" %>%
glue::glue() %>%
here::here() %>%
dir.create(path = .,
showWarnings = FALSE,
recursive = TRUE)
"{plasma}/{robj_dir}" %>%
glue::glue() %>%
here::here() %>%
dir.create(path = .,
showWarnings = FALSE,
recursive = TRUE)
scatterplot <- function(x, y, color) {
df <- data.frame(
feat1 = se_sub@assays$MAGIC_Spatial@data[x, ],
feat2 = se_sub@assays$MAGIC_Spatial@data[y, ],
color = se_sub@meta.data[, color]
)
ggplot2::ggplot(df,
ggplot2::aes(x = feat1,
y = feat2,
color = color)) +
ggplot2::geom_point() +
ggplot2::theme_classic() +
ggplot2::labs(
x = x,
y = y,
color = color)
}
The data used in this Rmarkdown document comes from 03-clustering_integration.Rmd where the data was integrated.
merged_se <- "{anot}/{robj_dir}/integrated_spatial_annot.rds" %>%
glue::glue() %>%
here::here() %>%
readRDS(file = .)
Load MAGIC data from the script MAGIC_denoising-plasma.Rmd
magic_df <- "{plasma}/{robj_dir}/MAGIC-mtrx.rds" %>%
glue::glue() %>%
here::here() %>%
readRDS(file = .)
# create a new assay to store ADT information
magic_assay <- CreateAssayObject(counts = as.matrix(magic_df))
# Subset merged_se to those barcodes used
merged_se <- merged_se[, colnames(magic_df)]
# add this assay to the previously created Seurat object
merged_se[["MAGIC_Spatial"]] <- magic_assay
Subset to only one sample
se_sub <- subset(merged_se, subset = gem_id == "esvq52_nluss5")
se_sub
## An object of class Seurat
## 26883 features across 3079 samples within 2 assays
## Active assay: Spatial (26846 features, 2000 variable features)
## 1 other assay present: MAGIC_Spatial
## 3 dimensional reductions calculated: pca, umap, harmony
se_sub@images <- se_sub@images[Seurat::Images(se_sub) == "esvq52_nluss5"]
A Spatially Resolved Dark- versus Light-Zone Microenvironment Signature Subdivides Germinal Center-Related Aggressive B Cell Lymphomas - Dark Zone: OAZ1, AICDA, H3, MKI67, POLH - Light Zone: LAG3, ITGB8, PDCD1, TIGIT, BCL2, PECAM1, LY6E, B7-H3 (CD276), HLA-DRB1, PSMB10, TNF, ARG1, HLA-E, STAT1
"{plasma}/gene_dict_plasma.R" %>%
glue::glue() %>%
here::here() %>%
source(file = .)
gene_vec <- rownames(magic_df)
Add genes to gene vec
# ig <- c("IGHG1", "IGHG2", "IGHG3", "IGHG4", "IGHA1", "IGHA2", "IGHE", "IGHM")
# pc <- c("XBP1", "CREB3L2", "CD9", "CD44", "PRDM1", "IRF4")
# gene_vec <- unique(c(gene_vec, ig))
# gene_vec <- gene_vec[gene_vec %in% rownames(merged_se)]
Add gene signatures for plasma_genes, these signatures are calculated with the lognorm expression.
# merged_se <- Seurat::AddModuleScore(
# object = merged_se,
# features = plasma_genes,
# name = names(plasma_genes))
# sign <- glue::glue("{names(plasma_genes)}{1:length(names(plasma_genes))}")
merged_se <- AddModuleScore_UCell(
obj = merged_se,
features = plasma_genes,
name = '_UCell'
)
Look at signatures
sign <- colnames(merged_se@meta.data)[stringr::str_detect(string = colnames(merged_se@meta.data), pattern = '_UCell')]
Seurat::SpatialPlot(
object = merged_se,
features = sign,
alpha = c(0, 1),
images = "esvq52_nluss5",
ncol = 4)
We also want to compute unbiased signatures from the top marker genes of the cell types of interest
# Read marker genes from plasma-deconvolution.Rmd
markers_lvl5_out <- "{plasma}/{robj_dir}/markers_lvl5_plasma.RDS" %>%
glue::glue() %>%
here::here()
mgs <- readRDS(markers_lvl5_out)
# Specify cell types of interest
int <- c("Early MBC-derived PC precursors", "LZ-derived early PC precursors",
"MBC-derived PC precursors")
# Get top 25 genes for each one of these cell types
sign_ls <- lapply(int, function(i) {
mgs %>%
# Subset cell type of interest
dplyr::filter(cluster == i & pct.2 < 0.25) %>%
# remove ribosomal and mitochondrial genes
dplyr::filter(stringr::str_detect(string = gene, pattern = "^Rp[l|s]|Mt", negate = TRUE)) %>%
# Sort genes
dplyr::arrange(dplyr::desc(avg_log2FC)) %>%
head(., 25) %>%
dplyr::pull(gene)
})
names(sign_ls) <- int
Add signatures to object
merged_se <- AddModuleScore_UCell(
obj = merged_se,
features = sign_ls,
name = '_UCell_mgs'
)
mgs_sign <- colnames(merged_se@meta.data)[stringr::str_detect(string = colnames(merged_se@meta.data), pattern = '_UCell_mgs')]
Look at marker gene derived signatures
Seurat::SpatialPlot(
object = merged_se,
features = mgs_sign,
alpha = c(0, 1),
images = "esvq52_nluss5",
ncol = 4)
palette <- colorBlindness::paletteMartin[seq_len(length(unique(merged_se$annotation.general)))]
names(palette) <- unique(merged_se$annotation.general)
Violin plots
Seurat::VlnPlot(
object = merged_se,
features = mgs_sign,
group.by = "annotation.general",
pt.size = 0,
cols = palette)
Restrict the visualization to the follicles
se_follicle <- merged_se[, merged_se$Spatial_snn_res.1.5 %in% c(3, 6, 8)]
library(colorBlindness)
palette <- colorBlindness::paletteMartin[13:15]
names(palette) <- c(3, 6, 8)
(Seurat::VlnPlot(
object = se_follicle,
features = c("DZ2", "LZ4"),
group.by = "Spatial_snn_res.1.5",
pt.size = 0,
cols = palette) |
Seurat::SpatialPlot(
object = se_follicle,
group.by = "Spatial_snn_res.1.5",
images = "esvq52_nluss5",
cols = palette)) /
Seurat::SpatialPlot(
object = se_follicle,
features = c("DZ2", "LZ4", "DZ.precPC3"),
images = "esvq52_nluss5",
cols = palette)
Look at the location where the marker genes are expressed along with the cell types
Seurat::DefaultAssay(merged_se) <- "MAGIC_Spatial"
gene_plt <- Seurat::SpatialFeaturePlot(
object = merged_se,
features = gene_vec,
alpha = c(0, 1),
ncol = 8,
images = "esvq52_nluss5")
"{plasma}/{plt_dir}/magic_plasma_markers.pdf" %>%
glue::glue() %>%
here::here() %>%
cowplot::save_plot(
filename = .,
plot = gene_plt,
base_height = 35,
base_width = 25)
Now with the log-norm expression
Seurat::DefaultAssay(merged_se) <- "Spatial"
gene_plt <- Seurat::SpatialFeaturePlot(
object = merged_se,
features = gene_vec,
alpha = c(0, 1),
ncol = 8,
images = "esvq52_nluss5")
"{plasma}/{plt_dir}/lognorm_plasma_markers.pdf" %>%
glue::glue() %>%
here::here() %>%
cowplot::save_plot(
filename = .,
plot = gene_plt,
base_height = 35,
base_width = 25)
Since we are working with sample esvq52_nluss5 in this example we will limit the correlation plot to this slide.
(cor_mtrx <- SCrafty::correlation_heatmap(
se = se_sub,
genes = gene_vec[!gene_vec %in% c("IGHV3-20", "IGHV3-43", "CXCR4")],
assay = "MAGIC_Spatial",
slot = "data"))
"{plasma}/{plt_dir}/magic_cor-mtrx_markers.pdf" %>%
glue::glue() %>%
here::here() %>%
cowplot::save_plot(
filename = .,
plot = cor_mtrx,
base_height = 15,
base_width = 15)
# Correlation with lognorm expression
cor_log <- SCrafty::correlation_heatmap(
se = se_sub,
genes = gene_vec[!gene_vec %in% c("IGHV3-20", "IGHV3-43", "CXCR4")],
assay = "Spatial",
slot = "data")
"{plasma}/{plt_dir}/lognorm_cor-mtrx_markers.pdf" %>%
glue::glue() %>%
here::here() %>%
cowplot::save_plot(
filename = .,
plot = cor_log,
base_height = 9,
base_width = 10)
Look at them side by side
cor_mtrx + cor_log
Before we run the gene-correlation matrix on the integrated Seurat object we want to make sure that the behavior across all slides is consistent.
lapply(id_sp_df$gem_id, function(id) {
print(id)
tmp_sub <- subset(merged_se, subset = gem_id == id)
tmp_sub@images <- tmp_sub@images[Seurat::Images(tmp_sub) == id]
(cor_mtrx_genes <- SCrafty::correlation_heatmap(
se = tmp_sub,
genes = gene_vec,
assay = "MAGIC_Spatial",
slot = "data") +
ggplot2::labs(
title = glue::glue("{id} - gene correlation matrix")))
"{plasma}/{plt_dir}/magic_cor-mtrx_markers_{id}.pdf" %>%
glue::glue() %>%
here::here() %>%
cowplot::save_plot(
filename = .,
plot = cor_mtrx_genes,
base_height = 9,
base_width = 10)
})
## [1] "tarwe1_xott6q"
## [1] "c28w2r_7jne4i"
## [1] "esvq52_nluss5"
## [1] "p7hv1g_tjgmyj"
## [1] "gcyl7c_cec61b"
## [1] "zrt7gl_lhyyar"
## [1] "qvwc8t_2vsr67"
## [1] "exvyh1_66caqq"
## [[1]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/plasma_integration/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_tarwe1_xott6q.pdf"
##
## [[2]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/plasma_integration/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_c28w2r_7jne4i.pdf"
##
## [[3]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/plasma_integration/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_esvq52_nluss5.pdf"
##
## [[4]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/plasma_integration/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_p7hv1g_tjgmyj.pdf"
##
## [[5]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/plasma_integration/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_gcyl7c_cec61b.pdf"
##
## [[6]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/plasma_integration/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_zrt7gl_lhyyar.pdf"
##
## [[7]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/plasma_integration/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_qvwc8t_2vsr67.pdf"
##
## [[8]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/plasma_integration/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_exvyh1_66caqq.pdf"
After checking all the slides seem to be consistent across the gene clusters observed:
(cor_mtrx_int <- SCrafty::correlation_heatmap(
se = merged_se,
genes = gene_vec,
assay = "MAGIC_Spatial",
slot = "data") +
ggplot2::labs(
title = "Integrated gene correlation matrix"))
"{plasma}/{plt_dir}/magic_cor-mtrx_markers_integrated.pdf" %>%
glue::glue() %>%
here::here() %>%
cowplot::save_plot(
filename = .,
plot = cor_mtrx_int,
base_height = 9,
base_width = 10)
(cor_mtrx_int <- SCrafty::correlation_heatmap(
se = merged_se,
genes = gene_vec,
assay = "Spatial",
slot = "data") +
ggplot2::labs(
title = "Integrated gene correlation matrix"))
We are going to look at how the genes change in a manually set path. To do this we use the SPATA2 package, vignette can be found here
We start by subsetting and converting to a SPATA object
# se_sub <- Seurat::RunTSNE(object = se_sub)
sp <- SPATA2::transformSeuratToSpata(
seurat_object = se_sub,
sample_name = "esvq52_nluss5",
image_name = "esvq52_nluss5",
assay_name = "MAGIC_Spatial",
assay_slot = "data",
method = "spatial",
coords_from = "umap",
verbose = TRUE)
Spatial trajectories of a sample in a given spata-object can be drawn interactively using the function createTrajectories() as shown in the example below. createTrajectories() opens a mini-shiny application. This app allows one the one hand to investigate the sample with regards to spatial gene expression like plotSurfaceInteractive() does and on the other hand to draw trajectories through the areas of interest in four easy steps.
# open interactive application
sp <- SPATA2::createTrajectories(
object = sp)
# Check that the trajectory has been determined correctly
names(sp@trajectories$esvq52_nluss5)
"{plasma}/{robj_dir}/spata-esvq52_nluss5-plasma.rds" %>%
glue::glue() %>%
here::here() %>%
saveRDS(object = sp, file = .)
Load drawn trajectories
sp <- "{plasma}/{robj_dir}/spata-esvq52_nluss5-plasma.rds" %>%
glue::glue() %>%
here::here() %>%
readRDS(file = .)
Look at the trajectory 1
plotTrajectory(object = sp,
trajectory_name = "DZ-LZ-PCZ",
color_by = "annotation.general",
pt_clrp = "npg",
pt_alpha = 0.25, # reduce alpha to highlight the trajectory's course
display_image = FALSE) +
scale_y_reverse() +
legendTop()
Look at the trajectory 2
plotTrajectory(object = sp,
trajectory_name = "DZ-LZ-TZ-PCZ",
color_by = "annotation.general",
pt_clrp = "npg",
pt_alpha = 0.25, # reduce alpha to highlight the trajectory's course
display_image = FALSE) +
scale_y_reverse() +
legendTop()
Look at the trajectory 3
plotTrajectory(object = sp,
trajectory_name = "HM-DZ-LZ-PCZ2",
color_by = "annotation.general",
pt_clrp = "npg",
pt_alpha = 0.25, # reduce alpha to highlight the trajectory's course
display_image = FALSE) +
scale_y_reverse() +
legendTop()
unbiased assessment of how genes vary over the trajectory
all_genes <- getGenes(sp)
# obtain an assessed trajectory data.frame for all genes
atdf_genes1 <- assessTrajectoryTrends(
object = sp,
trajectory_name = "DZ-LZ-PCZ",
variables = all_genes)
"{plasma}/{robj_dir}/gene_trajectory_trend-DZ-LZ-MZ-SE.rds" %>%
glue::glue() %>%
here::here() %>%
saveRDS(object = atdf_genes1, file = .)
Save the list of genes by trajectory trend in an xlsx sheet
library(xlsx)
atdf_genes1 <- "{plasma}/{robj_dir}/gene_trajectory_trend-DZ-LZ-PCZ.rds" %>%
glue::glue() %>%
here::here() %>%
readRDS(file = .)
out_file_gene1 <- "{plasma}/{robj_dir}/gene_trajectory_trend-DZ-LZ-PCZ.xlsx" %>%
glue::glue() %>%
here::here()
# Remove file prior to writing it so that there is no overwriting issue
file.remove(out_file_gene1)
lapply(unique(as.character(atdf_genes1$pattern)), function(i) {
tmp <- atdf_genes1 %>% dplyr::filter(pattern == i & auc < 0.75) %>% data.frame
print(head(tmp))
if (nrow(tmp) > 0) {
xlsx::write.xlsx(
tmp,
file = out_file_gene1,
row.names = FALSE,
sheetName = i,
append = file.exists(out_file_gene1))
}
})
unbiased assessment of how genes vary over the trajectory
# obtain an assessed trajectory data.frame for all genes
atdf_genes2 <- assessTrajectoryTrends(
object = sp,
trajectory_name = "DZ-LZ-TZ-PCZ",
variables = all_genes)
"{plasma}/{robj_dir}/gene_trajectory_trend-DZ-LZ-TZ-PCZ.rds" %>%
glue::glue() %>%
here::here() %>%
saveRDS(object = atdf_genes2, file = .)
Save the list of genes by trajectory trend in an xlsx sheet
library(xlsx)
atdf_genes2 <- "{plasma}/{robj_dir}/gene_trajectory_trend-DZ-LZ-TZ-PCZ.rds" %>%
glue::glue() %>%
here::here() %>%
readRDS(file = .)
out_file_gene2 <- "{plasma}/{robj_dir}/gene_trajectory_trend-DZ-LZ-TZ-PCZ.xlsx" %>%
glue::glue() %>%
here::here()
# Remove file prior to writing it so that there is no overwriting issue
file.remove(out_file_gene2)
lapply(unique(as.character(atdf_genes2$pattern)), function(i) {
tmp <- atdf_genes2 %>% dplyr::filter(pattern == i & auc < 0.75) %>% data.frame
print(head(tmp))
if (nrow(tmp) > 0) {
xlsx::write.xlsx(
tmp,
file = out_file_gene2,
row.names = FALSE,
sheetName = i,
append = file.exists(out_file_gene2))
}
})
Save the list of gene sets by trajectory trend in an xlsx sheet
library(xlsx)
out_file_gs <- "{plasma}/{robj_dir}/gene-set_trajectory_trend.xlsx" %>%
glue::glue() %>%
here::here()
# Remove file prior to writing it so that there is no overwriting issue
file.remove(out_file_gs)
lapply(unique(as.character(atdf_gene_sets$pattern)), function(i) {
tmp <- atdf_gene_sets %>% dplyr::filter(pattern == i & auc < 0.5) %>% data.frame
if (nrow(tmp) > 0) {
xlsx::write.xlsx(
tmp,
file = out_file_gs,
row.names = FALSE,
sheetName = i,
append = file.exists(out_file_gs))
}
})
Display trajectory trends with heatmaps DZ-LZ-PCZ
hm_colors <- viridis::inferno(n = 100)
(hm1 <- plotTrajectoryHeatmap(
object = sp,
trajectory_name = "DZ-LZ-PCZ",
variables = gene_vec[!gene_vec %in% c("IGHV3-20", "IGHV3-43")],
arrange_rows = "maxima",
# arrange_rows = "minima",
colors = hm_colors,
show_rownames = TRUE,
split_columns = TRUE,
smooth_span = 0.5))
"{plasma}/{plt_dir}/magic_trajectory-HM-DZ-LZ-PCZ.pdf" %>%
glue::glue() %>%
here::here() %>%
cowplot::save_plot(
filename = .,
plot = hm1,
base_height = 9,
base_width = 12)
Display trajectory trends with heatmaps LZ-DZ-IZ-PCZ
(hm2 <- plotTrajectoryHeatmap(
object = sp,
trajectory_name = "DZ-LZ-TZ-PCZ",
variables = gene_vec[!gene_vec %in% c("IGHV3-20", "IGHV3-43")],
arrange_rows = "maxima",
colors = hm_colors,
show_rownames = TRUE,
split_columns = TRUE,
smooth_span = 0.5))
"{plasma}/{plt_dir}/magic_trajectory-HM-LZ-DZ-IZ-PCZ.pdf" %>%
glue::glue() %>%
here::here() %>%
cowplot::save_plot(
filename = .,
plot = hm2,
base_height = 9,
base_width = 12)
Display trajectory trends with heatmaps DZ-LZ-PCZ2
hm_colors <- viridis::inferno(n = 100)
(hm3 <- plotTrajectoryHeatmap(
object = sp,
trajectory_name = "HM-DZ-LZ-PCZ2",
variables = gene_vec[!gene_vec %in% c("IGHV3-20", "IGHV3-43")],
arrange_rows = "maxima",
# arrange_rows = "minima",
colors = hm_colors,
show_rownames = TRUE,
split_columns = TRUE,
smooth_span = 0.5))
"{plasma}/{plt_dir}/magic_trajectory-HM-DZ-LZ-PCZ2.pdf" %>%
glue::glue() %>%
here::here() %>%
cowplot::save_plot(
filename = .,
plot = hm3,
base_height = 9,
base_width = 12)
sessionInfo()
## R version 4.0.1 (2020-06-06)
## Platform: x86_64-conda_cos6-linux-gnu (64-bit)
## Running under: Red Hat Enterprise Linux Server release 6.7 (Santiago)
##
## Matrix products: default
## BLAS/LAPACK: /scratch/groups/hheyn/software/anaconda3/envs/spatial_r/lib/libopenblasp-r0.3.12.so
##
## locale:
## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=es_ES.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=es_ES.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=es_ES.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=es_ES.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] stringr_1.4.0 UCell_1.2.0 SPATA2_0.1.0 ggplot2_3.3.5 dplyr_1.0.7 SeuratObject_4.0.4 Seurat_4.0.5
##
## loaded via a namespace (and not attached):
## [1] corrplot_0.92 systemfonts_1.0.3 plyr_1.8.6 igraph_1.2.10 lazyeval_0.2.2 splines_4.0.1 listenv_0.8.0 scattermore_0.7 GenomeInfoDb_1.26.7 digest_0.6.29 htmltools_0.5.2 viridis_0.6.2 fansi_0.5.0 magrittr_2.0.1 tensor_1.5 cluster_2.1.2 ROCR_1.0-11 tzdb_0.2.0 globals_0.14.0 readr_2.1.1 matrixStats_0.61.0 vroom_1.5.7 spatstat.sparse_2.0-0 prettyunits_1.1.1 colorspace_2.0-2 ggrepel_0.9.1 textshaping_0.3.6 xfun_0.29 crayon_1.4.2 RCurl_1.98-1.5 jsonlite_1.7.2 spatstat.data_2.1-0 survival_3.2-13 zoo_1.8-9 glue_1.5.1 polyclip_1.10-0 gtable_0.3.0 zlibbioc_1.36.0 XVector_0.30.0 leiden_0.3.9 DelayedArray_0.16.3 future.apply_1.8.1
## [43] SingleCellExperiment_1.12.0 BiocGenerics_0.36.1 abind_1.4-5 scales_1.1.1 pheatmap_1.0.12 DBI_1.1.1 miniUI_0.1.1.1 Rcpp_1.0.7 progress_1.2.2 viridisLite_0.4.0 xtable_1.8-4 gridGraphics_0.5-1 reticulate_1.22 spatstat.core_2.3-2 bit_4.0.4 stats4_4.0.1 htmlwidgets_1.5.4 httr_1.4.2 RColorBrewer_1.1-2 ellipsis_0.3.2 ica_1.0-2 farver_2.1.0 pkgconfig_2.0.3 sass_0.4.0 uwot_0.1.11 deldir_1.0-6 utf8_1.2.2 here_1.0.1 ggcorrplot_0.1.3 labeling_0.4.2 tidyselect_1.1.1 rlang_0.4.12 reshape2_1.4.4 later_1.3.0 munsell_0.5.0 tools_4.0.1 cli_3.1.0 generics_0.1.1 ggridges_0.5.3 evaluate_0.14 fastmap_1.1.0 ragg_1.2.1
## [85] yaml_2.2.1 goftest_1.2-3 bit64_4.0.5 knitr_1.36 fitdistrplus_1.1-6 purrr_0.3.4 RANN_2.6.1 pbapply_1.5-0 future_1.23.0 nlme_3.1-153 mime_0.12 SCrafty_0.1.0 compiler_4.0.1 plotly_4.10.0 png_0.1-7 spatstat.utils_2.3-0 confuns_0.1.0 tibble_3.1.6 bslib_0.3.1 stringi_1.7.6 highr_0.9 lattice_0.20-45 Matrix_1.4-0 vctrs_0.3.8 pillar_1.6.4 lifecycle_1.0.1 spatstat.geom_2.3-1 lmtest_0.9-39 jquerylib_0.1.4 RcppAnnoy_0.0.19 data.table_1.14.2 cowplot_1.1.1 bitops_1.0-7 irlba_2.3.5 httpuv_1.6.4 patchwork_1.1.1 GenomicRanges_1.42.0 R6_2.5.1 promises_1.2.0.1 KernSmooth_2.23-20 gridExtra_2.3 IRanges_2.24.1
## [127] parallelly_1.29.0 codetools_0.2-18 MASS_7.3-54 assertthat_0.2.1 SummarizedExperiment_1.20.0 rprojroot_2.0.2 withr_2.4.3 sctransform_0.3.2 S4Vectors_0.28.1 GenomeInfoDbData_1.2.4 mgcv_1.8-38 parallel_4.0.1 hms_1.1.1 colorBlindness_0.1.9 grid_4.0.1 rpart_4.1-15 tidyr_1.1.4 rmarkdown_2.11 MatrixGenerics_1.2.1 Rtsne_0.15 lubridate_1.8.0 Biobase_2.50.0 shiny_1.7.1